package collection.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
 * JDK8之后，集合提供了流式操作，以流的处理思路完成对集合元素的操作
 * 集合提供了一个方法:stream()，可以将集合变为一个"流"，流中的内容就是集合中的每个元素
 * 我们可以在流中添加各种中间环节(相当于IO中的高级流)，每个中间环节都会将经过的元素进行相应的处理
 * 最后要在stream上添加终端环节，用于得到最终的处理结果
 * 步骤: 集合转为流->中间环节->终端环节
 */
public class StreamApiDemo {
    public static void main(String[] args) {
        Random rand = new Random();
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<10;i++){
            list.add(rand.nextInt(10)); //0到9的随机数
        }
        System.out.println(list);

        /*
         常见的中间环节:
         1.map:处理
           map方法接收一个lambda表达式，将集合中每个元素都经过一次该表达式，并将表达式处理的结果替换该元素
         2.filter:过滤
           filter方法可以过滤流中的每个元素，仅保留符合lambda表达式要求的元素
         3.distinct:去重
           distinct方法可以过滤重复的元素
         3.sorted:排序
           sorted方法可以对流中的元素排序，该方法接收一个lambda表达式用于定义comparator
         */
        List<Integer> list2 = list.stream()     //将集合转为一个"流"
                                  .map(e->e*3)  //添加map中间环节，将每个元素扩大3倍
                                  .collect(Collectors.toList()); //终端环节，将流转为集合
        System.out.println("扩大3倍:"+list2);

        //仅保留集合中所有的偶数
        List<Integer> list3 = list.stream().filter(e->e%2==0).collect(Collectors.toList());
        System.out.println("仅保留偶数:"+list3);
        //对集合元素去重
        List<Integer> list4 = list.stream().distinct().collect(Collectors.toList());
        System.out.println("去重:"+list4);
        //对集合元素降序排列
        List<Integer> list5 = list.stream().sorted((e1,e2)->e2-e1).collect(Collectors.toList());
        System.out.println("降序后:"+list5);
        //对集合每个元素扩大3倍并获取其中所有的偶数然后去除重复元素并降序排列
        List<Integer> list6 = list.stream()
                                  .map(e->e*3)
                                  .filter(e->e%2==0)
                                  .distinct()
                                  .sorted((e1,e2)->e2-e1)
                                  .collect(Collectors.toList());
        System.out.println("上述所有功能:"+list6);
    }
}















